package com.project.common.data.mybatis.mapper;

import com.project.common.data.Persistence;
import com.project.common.data.mybatis.provider.ProviderAdapter;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

public interface PersistenceMapper<K extends Serializable, P extends Persistence<K>> {
    /**
     * 新增持久化对象到数据库中
     */
    @InsertProvider(type = ProviderAdapter.class)
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(P persistence);

    /**
     * method description: oracle版本insert 支持返回主键ID
     */
    void insertOracle(P persistence);

    /**
     * 根据主键更新数据库持久化对象，如果持久化对象的字段为空（null）， 则该字段为数据库字段的默认值
     */
    @UpdateProvider(type = ProviderAdapter.class)
    void update(P persistence);

    /**
     * 根据主键更新数据库持久化对象，如果持久化对象的字段为空（null），则不更新该字段
     */
    @UpdateProvider(type = ProviderAdapter.class)
    void updateSelective(P persistence);

    /**
     * 根据主键获取数据库的持久化对象
     */
    @SelectProvider(type = ProviderAdapter.class)
    P get(@Param("id") K key);

    /**
     * 获取数据库中的所有记录
     */
    @SelectProvider(type = ProviderAdapter.class)
    List<P> listAll();

    /**
     * 根据主键删除数据库持久化对象
     */
    @DeleteProvider(type = ProviderAdapter.class)
    void delete(@Param("id") K key);

    /**
     * 逻辑删除多想
     */
    @UpdateProvider(type = ProviderAdapter.class)
    void deleteLogical(@Param("id") K key);

    /**
     * 批量新增持久化对象到数据库中
     */
    void insertBatch(Collection<P> persistences);

    /**
     * 新增持久化对象到数据库中，触发唯一键则更新
     */
    void insertOrUpdate(P persistence);

    /**
     * 批量新增持久化对象到数据库中，触发唯一键则更新
     */
    void insertOrUpdateBatch(Collection<P> persistences);
}

